
module type DIM =
sig

  val rows : int
  val cols : int

end

module type T =
sig

  module D : DIM

  type 'a t
  val create : 'a -> 'a t  

  val get : 'a t -> int * int -> 'a
  val set : 'a t -> int * int * 'a -> unit
  val to_string : ('a -> string) -> 'a t -> string
  val print : ('a -> string) -> 'a t -> unit

  module Ops : 
  sig
    val ( % ) : 'a t -> int * int -> 'a  
    val ( <-- ) : 'a t -> int * int * 'a -> unit
  end

end

module S(D : DIM) : T with module D = D 
